/*
 * Filename:    KpiChartServiceImpl.java
 * Copyright:   2014 中国平安保险（集团）股份有限公司 版权所有
 * Company:     平安科技养老险及健康险系统开发部
 * Create at:   2014年10月15日
 */
package com.paic.mhis.hcpms.quota.settlement.biz.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.paic.mhis.hcpms.quota.calculationreport.kpiinterface.biz.service.KpiCoreDataService;
import com.paic.mhis.hcpms.quota.calculationreport.kpiinterface.dto.KpiCateDTO;
import com.paic.mhis.hcpms.quota.calculationreport.kpiinterface.dto.KpiConditionDTO;
import com.paic.mhis.hcpms.quota.calculationreport.kpiinterface.dto.KpiDeptDTO;
import com.paic.mhis.hcpms.quota.calculationreport.kpiinterface.dto.KpiDoctorDTO;
import com.paic.mhis.hcpms.quota.calculationreport.kpiinterface.dto.KpiGradeDTO;
import com.paic.mhis.hcpms.quota.calculationreport.kpiinterface.dto.KpiMedicalOrgDTO;
import com.paic.mhis.hcpms.quota.calculationreport.kpiinterface.dto.KpiSociationDTO;
import com.paic.mhis.hcpms.quota.settlement.biz.service.KpiChartService;
import com.paic.mhis.hcpms.quota.settlement.common.KpiValueConst;
import com.pingan.um.client.util.StringUtil;

@Component("kpiChartService")
public class KpiChartServiceImpl implements KpiChartService {

	@Autowired
	KpiCoreDataService kpiCoreDataService;
	@Autowired
	private KpiChartHelp kpiChartHelp; // 查询指标echarts 数据帮助类

	@Override
	public Map<String, Object> getKpiChartValue(KpiConditionDTO condition, List<Map<String, Object>> ids, String kpiId) {
		Map<String, Object> resultMap = new HashMap<String, Object>();
		// 指标
		List<String> kpiIdList = this.getKpiIdList(kpiId);

		condition.setKpiCodeList(kpiIdList);

		// 开始日期
		String startDate = condition.getKpiTimeStart();

		// 结束日期
		String endDate = condition.getKpiTimeEnd();

		int idsSize = ids.size();
		List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();
		for (int i = 0; i < idsSize; i++) {

			Map<String, Object> map = ids.get(i);
			// id
			String id = map.get("id").toString();

			// 名称
			String name = map.get("name").toString();

			// 类型
			String type = map.get("type").toString();
			// 统筹区 编码
			String regionCode = "";
			if (StringUtil.isNotNull(map.get("regionCode"))) {
				regionCode = map.get("regionCode").toString();
				condition.setSociationCode(regionCode);
			}
			// 医疗机构 编码
			String orgCode = "";
			if (StringUtil.isNotNull(map.get("orgCode"))) {
				orgCode = map.get("orgCode").toString();
			}
			// 医疗机构 科室编码
			String departCode = "";
			if (StringUtil.isNotNull(map.get("departCode"))) {
				departCode = map.get("departCode").toString();
			}

			Map<String, Object> kpiMap = new HashMap<String, Object>();
			// 统筹区维度
			if (type.equals("region")) {
				condition.setSociationCode(id);
				List<KpiSociationDTO> kpiSociationList = kpiCoreDataService.queryKpiBySoc(condition);
				kpiMap = this.kpiChartHelp.processKpiSociationMent(kpiIdList, kpiSociationList, startDate, endDate);
			}// 医院等级维度
			else if (type.equals("level")) {
				condition.setGrade(id);
				List<KpiGradeDTO> kpiGradeList = kpiCoreDataService.queryKpiByGrade(condition);
				kpiMap = this.kpiChartHelp.processKpiGradeMent(kpiIdList, kpiGradeList, startDate, endDate);
			}
			// 医院类型维度
			else if (type.equals("orgCategory")) {
				condition.setCate(id);
				List<KpiCateDTO> kpiCateList = kpiCoreDataService.queryKpiByCate(condition);
				kpiMap = this.kpiChartHelp.processKpiCateMent(kpiIdList, kpiCateList, startDate, endDate);
			}
			// 医疗机构维度
			else if (type.equals("org")) {
				condition.setOrgCode(id);
				List<KpiMedicalOrgDTO> kpiMedicalOrgList = kpiCoreDataService.queryKpiByOrg(condition);
				kpiMap = this.kpiChartHelp.processKpiMedicalOrgMent(kpiIdList, kpiMedicalOrgList, startDate, endDate);
			} // 科室维度
			else if (type.equals("depart")) {
				condition.setOrgCode(orgCode);
				condition.setDeptCode(id);
				List<KpiDeptDTO> kpiDeptList = kpiCoreDataService.queryKpiByDept(condition);
				kpiMap = this.kpiChartHelp.processKpiDeptOrgMent(kpiIdList, kpiDeptList, startDate, endDate);
			}
			// 医生维度
			else if (type.equals("doctor")) {
				condition.setOrgCode(orgCode);
				condition.setDeptCode(departCode);
				condition.setDoctorCode(id);
				List<KpiDoctorDTO> kpiDoctorList = kpiCoreDataService.queryKpiByDoctor(condition);
				kpiMap = this.kpiChartHelp.processKpiDoctorOrgMent(kpiIdList, kpiDoctorList, startDate, endDate);
			}
			kpiMap.put("name", name);
			resultList.add(kpiMap);
		}
		resultMap.put("data", resultList);
		return resultMap;
	}

	/**
	 * 根据指标 获取相对应的指标集合
	 * 
	 * @param kpiId
	 * @return
	 */
	private List<String> getKpiIdList(String kpiId) {

		List<String> kpiIdList = new ArrayList<String>();

		// 医保费用占比 || 医疗费用预拔
		if (kpiId.equals(KpiValueConst.KPI0003) || kpiId.equals(KpiValueConst.KPI0002)) {
			kpiIdList.add(KpiValueConst.KPI0001);// 医疗费用总额
			kpiIdList.add(KpiValueConst.KPI0002);// 医保费用占比
			kpiIdList.add(KpiValueConst.KPI0003);// 医疗费用预拨
		}
		// 次均医疗费用 || 就医人次
		else if (kpiId.equals(KpiValueConst.KPI0004) || kpiId.equals(KpiValueConst.KPI0010)) {
			kpiIdList.add(KpiValueConst.KPI0001); // 医疗费用总额
			kpiIdList.add(KpiValueConst.KPI0004); // 次均医疗费用
			kpiIdList.add(KpiValueConst.KPI0010); // 就医人次
		}
		// 药费占比
		else if (kpiId.equals(KpiValueConst.KPI0055)) {
			kpiIdList.add(KpiValueConst.KPI0055); // 药费占比
			kpiIdList.add(KpiValueConst.KPI0008);// 检查化验费占比
			kpiIdList.add(KpiValueConst.KPI0009);// 手术费
		}
		// 平均住院日
		else if (kpiId.equals(KpiValueConst.KPI0006)) {
			kpiIdList.add(KpiValueConst.KPI0006);// 平均住院日
			kpiIdList.add(KpiValueConst.KPI0007);// 平均床位费
		}
		// 医疗费用总额
		else if (kpiId.equals(KpiValueConst.KPI0001)) {
			kpiIdList.add(KpiValueConst.KPI0001);// 医疗费用总额
			kpiIdList.add(KpiValueConst.KPI0002);// 医保费用占比
			kpiIdList.add(KpiValueConst.KPI0003);// 医疗费用预拨
		}
		/** 330 **/
		// 平均床日费
		else if (kpiId.equals(KpiValueConst.KPI0007)) {
			kpiIdList.add(KpiValueConst.KPI0007);// 平均床日费
			kpiIdList.add(KpiValueConst.KPI0006);// 平均住院日
			kpiIdList.add(KpiValueConst.KPI0027);// 实际床日数
		}
		// 检查化验费占比
		else if (kpiId.equals(KpiValueConst.KPI0008)) {
			kpiIdList.add(KpiValueConst.KPI0008);// 检查化验费占比
			kpiIdList.add(KpiValueConst.KPI0026);// 检查化验费
			kpiIdList.add(KpiValueConst.KPI0055);// 药费占比
			kpiIdList.add(KpiValueConst.KPI0009); // 手术费占比
		}
		// 手术费占比
		else if (kpiId.equals(KpiValueConst.KPI0009)) {
			kpiIdList.add(KpiValueConst.KPI0055);// 药费占比
			kpiIdList.add(KpiValueConst.KPI0008);// 检查化验费占比
			kpiIdList.add(KpiValueConst.KPI0009);// 手术费占比
			kpiIdList.add(KpiValueConst.KPI0025);// 手术费

		}
		// 统筹基金支付占比（基金支付占总费用比例）
		else if (kpiId.equals(KpiValueConst.KPI0014)) {
			kpiIdList.add(KpiValueConst.KPI0014);// 统筹基金支付占比（基金支付占总费用比例）
			kpiIdList.add(KpiValueConst.KPI0023);// 统筹基金支付
			kpiIdList.add(KpiValueConst.KPI0001);// 医疗费用总额
		}
		// 人均统筹基金费用
		else if (kpiId.equals(KpiValueConst.KPI0013)) {
			kpiIdList.add(KpiValueConst.KPI0013);// 人均统筹基金费用
			kpiIdList.add(KpiValueConst.KPI0023);// 统筹基金支付
			kpiIdList.add(KpiValueConst.KPI0039); // 就医人数
		}
		// 门诊医生日均诊疗次数
		else if (kpiId.equals(KpiValueConst.KPI0016)) {
			kpiIdList.add(KpiValueConst.KPI0016);// 门诊医生日均诊疗次数
			kpiIdList.add(KpiValueConst.KPI0004);// 次均医疗费用
			kpiIdList.add(KpiValueConst.KPI0038);// 次均医疗费用
		}
		// 个人现金支付占比
		else if (kpiId.equals(KpiValueConst.KPI0028)) {
			kpiIdList.add(KpiValueConst.KPI0028);// 个人现金支付占比
			kpiIdList.add(KpiValueConst.KPI0021);// 个人现金支付
			kpiIdList.add(KpiValueConst.KPI0022);// 个人账户支付
			kpiIdList.add(KpiValueConst.KPI0014);// 统筹基金占比

		}
		return kpiIdList;
	}
}
